home *** CD-ROM | disk | FTP | other *** search
/ Packard Bell - Internet on a CD / internet on a cd.cdr / Internet / sites / Clementine_NASA / decomp1.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-07-16  |  22.4 KB  |  891 lines

  1. /*
  2.  *    THIS ROUTINE IS PART OF THE CLEMENTINE PDS FILE READER PROGRAM.
  3.  *    IT WAS WRITTEN BY ACT CORP. IN DIRECT SUPPORT TO THE
  4.  *    CLEMENTINE (DSPSE) PROGRAM.
  5.  *
  6.  *    IF YOU FIND A PROBLEM OR MAKE ANY CHANGES TO THIS CODE PLEASE CONTACT
  7.  *    Dr. Erick Malaret at ACT Corp.
  8.  *            tel: (703) 742-0294
  9.  *                 (703) 683-7431
  10.  *                       email:    nrlvax.nrl.navy.mil
  11.  *
  12.  *
  13.  */
  14. /*
  15.     Program to calculate the Discrete Cosine Transform of a 8x8 block of data
  16. */
  17.  
  18. #include <stdio.h>
  19. #ifdef __BORLANDC__
  20. #include <alloc.h>
  21. #else
  22. #include <malloc.h>
  23. #endif
  24. #include <string.h>
  25. #include <math.h>
  26. #include "jpeg_c.h"
  27.  
  28. #define TRUE    1
  29. #define FALSE    0
  30.  
  31. extern int    OPTIMIZE;
  32. extern int    SLOWDECOMP;
  33. long        *DCTHist[64];
  34. float        *Rn[64];
  35. float    Q[64];
  36. float    C[64], Ct[64];
  37. float    qtable[64];
  38. float    U[64];
  39. short    ULS[64];
  40. int    zzseq[] = {0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,
  41.             48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,
  42.             22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,
  43.             47,55,62,63};
  44.  
  45. void core(void);
  46. void getDCTHist(BitStream *bs, long rows, long cols);
  47. void getRn(void);
  48. void initC(float *m, short N);
  49. void transp(float *out, float *in, short N);
  50. void matmult1(float *out, float *in1, float *in2, short N);
  51.  
  52. /****************************************************************************/
  53. void decomp(BitStream *bs, CHARH *Image, long rows, long cols)
  54. {
  55.     short    i,j,k,indexi,indexip8,indexj,indexjp8;
  56.     float    temp;
  57.     float    V1[64];
  58.     long    rowsleft, colsleft, icols;
  59.     short    Done, Diff, Pred;
  60.  
  61.     /*********************** Image Decompression *********************/
  62.     Done = FALSE;
  63.     rowsleft = rows;
  64.     colsleft = cols;
  65.     indexj = 0;
  66.     indexi = 0;
  67.     Pred = 0;
  68.  
  69.     while ( !Done ) {
  70.         /* Decode block data */
  71.         decode(ULS,bs);
  72.         Diff = ULS[0] + Pred;
  73.         Pred = Diff;
  74.         ULS[0] = Diff;
  75.  
  76.         /* Calculate Inverse Discrete Cosine Transform */
  77.         /*dequantize(U,ULS1,pt_qtable);  64 multiplications */
  78.         for (i=0; i<64; i++) {
  79.             if ( OPTIMIZE ) {
  80.                 temp = Rn[i][ULS[i]];
  81.                 if ( SLOWDECOMP )
  82.                     U[zzseq[i]] = temp * Q[i];
  83.                 else
  84.                     U[zzseq[i]] = temp * qtable[i];
  85.             } else {
  86.                 if ( SLOWDECOMP )
  87.                     U[zzseq[i]] = ULS[i] * Q[i];
  88.                 else
  89.                     U[zzseq[i]] = ULS[i] * qtable[i];
  90.             }
  91.         }
  92.  
  93.         if ( SLOWDECOMP ) {
  94.             matmult1(V1,Ct,U,8);
  95.             matmult1(U,V1,C,8);
  96.         } else {
  97.             core();
  98.         }
  99.  
  100.         /*ilevelshift(U);*/
  101.         for (i=0; i<64; i++) {
  102.             U[i] += 128.0;
  103.             U[i] = floor( U[i] + 0.5 );
  104.             if ( U[i] > 255.0 ) U[i] = 255.0;
  105.             else if ( U[i] < 0.0 ) U[i] = 0.0;
  106.             else;
  107.         }
  108.  
  109.         indexip8 = indexi + 8;
  110.         indexjp8 = indexj + 8;
  111.  
  112.         if ( (rowsleft > 8) && (colsleft > 8) ) {
  113.  
  114.             for (i=indexi, k=0; i < indexip8; i++)
  115.                 for (j=indexj, icols=i*cols; j < indexjp8; j++, k++)
  116.                     Image[icols+j] = (char)U[k];
  117.  
  118.             indexj += 8;
  119.             colsleft -= 8;
  120.         }
  121.         else if ( (rowsleft > 8) && (colsleft <= 8) ) {
  122.  
  123.             for (i=indexi, k=0; i < indexip8; i++) {
  124.                 for (j=indexj, icols=i*cols; j < cols; j++, k++)
  125.                     Image[icols+j] = (char)U[k];
  126.                 k += (8 - colsleft);
  127.             }
  128.  
  129.             indexj = 0;
  130.             indexi += 8;
  131.             rowsleft -= 8;
  132.             colsleft = cols;
  133.         }
  134.         else if ( (rowsleft <= 8) && (colsleft > 8) ) {
  135.  
  136.             for (i=indexi, k=0; i < rows; i++)
  137.                 for (j=indexj, icols=i*cols; j < indexjp8; j++, k++)
  138.                     Image[icols+j] = (char)U[k];
  139.  
  140.             indexj += 8;
  141.             colsleft -= 8;
  142.         }
  143.         else {
  144.  
  145.             for (i=indexi, k=0; i < rows; i++) {
  146.                 for (j=indexj, icols=i*cols; j < cols; j++, k++)
  147.                     Image[icols+j] = (char)U[k];
  148.                 k += (8 - colsleft);
  149.             }
  150.  
  151.             Done = TRUE;
  152.         }
  153.     }
  154. }
  155.  
  156. void getDCTHist(BitStream *bs, long rows, long cols)
  157. {
  158.     short    Pred, i;
  159.     long    nblocks;
  160.  
  161.     nblocks = (rows * cols) / 64;
  162.     Pred = 0;
  163.  
  164.     while ( nblocks ) {
  165.         /* Decode block data */
  166.         decode(ULS,bs);
  167.         ULS[0] += Pred;
  168.         Pred = ULS[0];
  169.  
  170.         for (i=0; i<64; i++) DCTHist[i][ULS[i]]++;
  171.  
  172.         nblocks--;
  173.     }
  174. }
  175.  
  176. void getRn()
  177. {
  178.     short    i, j;
  179.     float    lb, ub, a, b, num, den, phi;
  180.     float    m, pa, pap, pb, pbp, pm, pmp;
  181.  
  182.     for (i=0; i<64; i++) {
  183.         Rn[i][-256] = (float)-256;
  184.         Rn[i][256] = (float)256;
  185. /*
  186.         for (j=-255; j<256; j++) {
  187.             if ( DCTHist[i][j] > 0 ) {
  188.                 m  = ((float)j)*Q[i];
  189.                 pm = DCTHist[i][j];
  190.                 pmp = m*pm;
  191.  
  192.                 a = ((float)j - 0.5)*Q[i];
  193.                 phi = 0.5;
  194.                 pa = phi*DCTHist[i][j] + (1.0-phi)*DCTHist[i][j-1];
  195.                 pap = ((float)j*pa - (1.0-phi)*DCTHist[i][j-1])*Q[i];
  196.  
  197.                 b = ((float)j + 0.5)*Q[i];
  198.                 phi = 0.5;
  199.                 pb = phi*DCTHist[i][j+1] + (1.0-phi)*DCTHist[i][j];
  200.                 pbp = ((float)j*pb + phi*DCTHist[i][j+1])*Q[i];
  201.  
  202.                 num = (m-a)*(pap+pmp)+(b-m)*(pbp+pmp);
  203.                 den = (m-a)*(pa+pm)+(b-m)*(pb+pm);
  204.                 Rn[i][j] = (num/den)/Q[i];
  205.             } else {
  206.                 Rn[i][j] = (float)j;
  207.             }
  208.         }
  209. */
  210.         for (j=-255; j<256; j++) {
  211.             if ( DCTHist[i][j] > 0 ) {
  212.                 lb = ((float)j - 0.5)*Q[i];
  213.                 ub = ((float)j + 0.5)*Q[i];
  214.  
  215.                 m  = ((float)j)*Q[i];
  216.                 pm = DCTHist[i][j];
  217.                 pmp = m*pm;
  218.  
  219.                 a = ceil(lb);
  220.                 phi = a/Q[i] - (float)(j-1);
  221.                 pa = phi*DCTHist[i][j] + (1.0-phi)*DCTHist[i][j-1];
  222.                 pap = ((float)j*pa - (1.0-phi)*DCTHist[i][j-1])*Q[i];
  223.  
  224.                 b = ceil(ub);
  225.                 phi = b/Q[i] - (float)j;
  226.                 pb = phi*DCTHist[i][j+1] + (1.0-phi)*DCTHist[i][j];
  227.                 pbp = ((float)j*pb + phi*DCTHist[i][j+1])*Q[i];
  228.  
  229.                 num = (m-a)*(pap+pmp)+(b-m)*(pbp+pmp);
  230.                 den = (m-a)*(pa+pm)+(b-m)*(pb+pm);
  231.                 Rn[i][j] = (num/den)/Q[i];
  232.             } else {
  233.                 Rn[i][j] = (float)j;
  234.             }
  235.         }
  236.     }
  237. }
  238.  
  239. #define PI 3.141592653589793
  240.  
  241. void initC(float *m, short N)
  242. {
  243.     short     i, j, k;
  244.  
  245.     for (i=0, k=0; i<N; i++) {
  246.         if ( i == 0 )
  247.             for (j=0; j<N; j++, k++) m[k] = 1.0 / (float)sqrt((float)N);
  248.         else
  249.             for (j=0; j<N; j++, k++)
  250.                 m[k] = (float)cos((2.0*j+1.0)*PI*i/(2.0*N)) * (float)sqrt(2.0/N);
  251.     }
  252. }
  253.  
  254. void transp(float *out, float *in, short N)
  255. {
  256.     short     i,j;
  257.  
  258.     for (i=0; i < N; i++) {
  259.         out[i*N+i] = in[i*N+i];
  260.         for (j=i+1; j < N; j++) {
  261.             out[i*N+j] = in[j*N+i];
  262.             out[j*N+i] = in[i*N+j];
  263.         }
  264.     }
  265. }
  266.  
  267. void matmult1(float *out, float *in1, float *in2, short N)
  268. {
  269.     short   i,j,k,isl3;
  270.  
  271.     for (i=0; i<N; i++) {
  272.         for (j=0, isl3=(i<<3); j<N; j++, out++) {
  273.             *out = 0;
  274.             for (k=0; k<N; k++) {
  275.                 *out += in1[(isl3)+k] * in2[(k<<3)+j];
  276.             }
  277.         }
  278.     }
  279. }
  280.  
  281. void core(void)
  282. {
  283.     float   out[64], out1[64];
  284.     float   temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8;
  285.     float   dummy1, dummy2, dummy3;
  286.     float   buffer11,buffer12,buffer13,buffer14,buffer15,buffer16,buffer17,buffer18;
  287.     float   buffer21,buffer22,buffer23,buffer24,buffer25,buffer26,buffer27,buffer28;
  288.  
  289.     /******** Preadditions ********/
  290.     out[0] = U[0];
  291.     out[1] = U[32];
  292.     out[2] = U[16] - U[48];
  293.     out[3] = U[16] + U[48];
  294.     dummy1 = U[8] - U[56];
  295.     dummy2 = U[24] - U[40];
  296.     out[4] = dummy1 - dummy2;
  297.     out[5] = dummy1 + dummy2;
  298.     out[6] = -U[8] - U[56];
  299.     out[7] = U[24] + U[40]; /* 8 additions */
  300.  
  301.     out[8] = U[4];
  302.     out[9] = U[36];
  303.     out[10] = U[20] - U[52];
  304.     out[11] = U[20] + U[52];
  305.     dummy1 = U[12] - U[60];
  306.     dummy2 = U[28] - U[44];
  307.     out[12] = dummy1 - dummy2;
  308.     out[13] = dummy1 + dummy2;
  309.     out[14] = -U[12] - U[60];
  310.     out[15] = U[28] + U[44]; /* 8 additions */
  311.  
  312.     temp1 = U[2] - U[6];
  313.     temp2 = U[34] - U[38];
  314.     temp3 = U[18] - U[22];
  315.     temp4 = U[50] - U[54];
  316.     temp5 = U[10] - U[14];
  317.     temp6 = U[26] - U[30];
  318.     temp7 = U[58] - U[62];
  319.     temp8 = U[42] - U[46];
  320.     out[16] = temp1;
  321.     out[17] = temp2;
  322.     out[18] = temp3 - temp4;
  323.     out[19] = temp3 + temp4;
  324.     dummy1 = temp5 - temp7;
  325.     dummy2 = temp6 - temp8;
  326.     out[20] = dummy1 - dummy2;
  327.     out[21] = dummy1 + dummy2;
  328.     out[22] = -temp5 - temp7;
  329.     out[23] = temp6 + temp8; /* 16 additions */
  330.  
  331.     temp1 = U[2] + U[6];
  332.     temp2 = U[34] + U[38];
  333.     temp3 = U[18] + U[22];
  334.     temp4 = U[50] + U[54];
  335.     temp5 = U[10] + U[14];
  336.     temp6 = U[26] + U[30];
  337.     temp7 = U[58] + U[62];
  338.     temp8 = U[42] + U[46];
  339.     out[24] = temp1;
  340.     out[25] = temp2;
  341.     out[26] = temp3 - temp4;
  342.     out[27] = temp3 + temp4;
  343.     dummy1 = temp5 - temp7;
  344.     dummy2 = temp6 - temp8;
  345.     out[28] = dummy1 - dummy2;
  346.     out[29] = dummy1 + dummy2;
  347.     out[30] = -temp5 - temp7;
  348.     out[31] = temp6 + temp8; /* 16 additions */
  349.  
  350.     buffer11 = U[1] - U[7]; buffer21 = U[3] - U[5];
  351.     buffer12 = U[33] - U[39]; buffer22 = U[35] - U[37];
  352.     buffer13 = U[17] - U[23]; buffer23 = U[19] - U[21];
  353.     buffer14 = U[49] - U[55]; buffer24 = U[51] - U[53];
  354.     buffer15 = U[9] - U[15]; buffer25 = U[11] - U[13];
  355.     buffer16 = U[25] - U[31]; buffer26 = U[27] - U[29];
  356.     buffer17 = U[57] - U[63]; buffer27 = U[59] - U[61];
  357.     buffer18 = U[41] - U[47]; buffer28 = U[43] - U[45];
  358.     temp1 = buffer11 - buffer21;
  359.     temp2 = buffer12 - buffer22;
  360.     temp3 = buffer13 - buffer23;
  361.     temp4 = buffer14 - buffer24;
  362.     temp5 = buffer15 - buffer25;
  363.     temp6 = buffer16 - buffer26;
  364.     temp7 = buffer17 - buffer27;
  365.     temp8 = buffer18 - buffer28;
  366.     out[32] = temp1;
  367.     out[33] = temp2;
  368.     out[34] = temp3 - temp4;
  369.     out[35] = temp3 + temp4;
  370.     dummy1 = temp5 - temp7;
  371.     dummy2 = temp6 - temp8;
  372.     out[36] = dummy1 - dummy2;
  373.     out[37] = dummy1 + dummy2;
  374.     out[38] = -temp5 - temp7;
  375.     out[39] = temp6 + temp8;
  376.     temp1 = buffer11 + buffer21;
  377.     temp2 = buffer12 + buffer22;
  378.     temp3 = buffer13 + buffer23;
  379.     temp4 = buffer14 + buffer24;
  380.     temp5 = buffer15 + buffer25;
  381.     temp6 = buffer16 + buffer26;
  382.     temp7 = buffer17 + buffer27;
  383.     temp8 = buffer18 + buffer28;
  384.     out[40] = temp1;
  385.     out[41] = temp2;
  386.     out[42] = temp3 - temp4;
  387.     out[43] = temp3 + temp4;
  388.     dummy1 = temp5 - temp7;
  389.     dummy2 = temp6 - temp8;
  390.     out[44] = dummy1 - dummy2;
  391.     out[45] = dummy1 + dummy2;
  392.     out[46] = -temp5 - temp7;
  393.     out[47] = temp6 + temp8; /* 48 additions */
  394.  
  395.     temp1 = -U[1] - U[7];
  396.     temp2 = -U[33] - U[39];
  397.     temp3 = -U[17] - U[23];
  398.     temp4 = -U[49] - U[55];
  399.     temp5 = -U[9] - U[15];
  400.     temp6 = -U[25] - U[31];
  401.     temp7 = -U[57] - U[63];
  402.     temp8 = -U[41] - U[47];
  403.     out[48] = temp1;
  404.     out[49] = temp2;
  405.     out[50] = temp3 - temp4;
  406.     out[51] = temp3 + temp4;
  407.     dummy1 = temp5 - temp7;
  408.     dummy2 = temp6 - temp8;
  409.     out[52] = dummy1 - dummy2;
  410.     out[53] = dummy1 + dummy2;
  411.     out[54] = -temp5 - temp7;
  412.     out[55] = temp6 + temp8; /* 16 additions */
  413.  
  414.     temp1 = U[3] + U[5];
  415.     temp2 = U[35] + U[37];
  416.     temp3 = U[19] + U[21];
  417.     temp4 = U[51] + U[53];
  418.     temp5 = U[11] + U[13];
  419.     temp6 = U[27] + U[29];
  420.     temp7 = U[59] + U[61];
  421.     temp8 = U[43] + U[45];
  422.     out[56] = temp1;
  423.     out[57] = temp2;
  424.     out[58] = temp3 - temp4;
  425.     out[59] = temp3 + temp4;
  426.     dummy1 = temp5 - temp7;
  427.     dummy2 = temp6 - temp8;
  428.     out[60] = dummy1 - dummy2;
  429.     out[61] = dummy1 + dummy2;
  430.     out[62] = -temp5 - temp7;
  431.     out[63] = temp6 + temp8; /* 16 additions */
  432.     /*for (i=0; i<64; i++) printf("out[%d] = %f\n",i,out[i]);*/
  433.  
  434.     /********* Core Processing *********/
  435.     out1[0] = out[0];
  436.     out1[1] = out[1];
  437.     out1[2] = out[2];
  438.     out1[3] = 0.707106781 * out[3];
  439.     out1[4] = out[4];
  440.     out1[5] = 0.707106781 * out[5];
  441.     dummy1 = 1.306562964 * out[6];
  442.     dummy2 = 0.923879532 * (out[6] + out[7]);
  443.     dummy3 = -0.5411961 * out[7];
  444.     out1[6] = dummy1 - dummy2;
  445.     out1[7] = dummy2 + dummy3;   /* 5 multiplications, 3 additions */
  446.  
  447.     out1[8] = out[8];
  448.     out1[9] = out[9];
  449.     out1[10] = out[10];
  450.     out1[11] = 0.707106781 * out[11];
  451.     out1[12] = out[12];
  452.     out1[13] = 0.707106781 * out[13];
  453.     dummy1 = 1.306562964 * out[14];
  454.     dummy2 = 0.923879532 * (out[14] + out[15]);
  455.     dummy3 = -0.5411961 * out[15];
  456.     out1[14] = dummy1 - dummy2;
  457.     out1[15] = dummy2 + dummy3;   /* 5 multiplications, 3 additions */
  458.  
  459.     out1[16] = out[16];
  460.     out1[17] = out[17];
  461.     out1[18] = out[18];
  462.     out1[19] = 0.707106781 * out[19];
  463.     out1[20] = out[20];
  464.     out1[21] = 0.707106781 * out[21];
  465.     dummy1 = 1.306562964 * out[22];
  466.     dummy2 = 0.923879532 * (out[22] + out[23]);
  467.     dummy3 = -0.5411961 * out[23];
  468.     out1[22] = dummy1 - dummy2;
  469.     out1[23] = dummy2 + dummy3;   /* 5 multiplications, 3 additions */
  470.  
  471.     out1[32] = out[32];
  472.     out1[33] = out[33];
  473.     out1[34] = out[34];
  474.     out1[35] = 0.707106781 * out[35];
  475.     out1[36] = out[36];
  476.     out1[37] = 0.707106781 * out[37];
  477.     dummy1 = 1.306562964 * out[38];
  478.     dummy2 = 0.923879532 * (out[38] + out[39]);
  479.     dummy3 = -0.5411961 * out[39];
  480.     out1[38] = dummy1 - dummy2;
  481.     out1[39] = dummy2 + dummy3;   /* 5 multiplications, 3 additions */
  482.  
  483.     out1[24] = 0.707106781 * out[24];
  484.     out1[25] = 0.707106781 * out[25];
  485.     out1[26] = 0.707106781 * out[26];
  486.     out1[27] = 0.5 * out[27];
  487.     out1[28] = 0.707106781 * out[28];
  488.     out1[29] = 0.5 * out[29];
  489.     dummy1 = 0.923879532 * out[30];
  490.     dummy2 = 0.653281481 * (out[30] + out[31]);
  491.     dummy3 = -0.382683432 * out[31];
  492.     out1[30] = dummy1 - dummy2;
  493.     out1[31] = dummy2 + dummy3;   /* 9 multiplications, 3 additions */
  494.  
  495.     out1[40] = 0.707106781 * out[40];
  496.     out1[41] = 0.707106781 * out[41];
  497.     out1[42] = 0.707106781 * out[42];
  498.     out1[43] = 0.5 * out[43];
  499.     out1[44] = 0.707106781 * out[44];
  500.     out1[45] = 0.5 * out[45];
  501.     dummy1 = 0.923879532 * out[46];
  502.     dummy2 = 0.653281481 * (out[46] + out[47]);
  503.     dummy3 = -0.382683432 * out[47];
  504.     out1[46] = dummy1 - dummy2;
  505.     out1[47] = dummy2 + dummy3;   /* 9 multiplications, 3 additions */
  506.  
  507.     dummy1 = 1.306562964 * out[48];
  508.     dummy2 = 0.923879532 * (out[48] + out[56]);
  509.     dummy3 = -0.5411961 * out[56];
  510.     out1[48] = dummy1 - dummy2;
  511.     out1[56] = dummy2 + dummy3;
  512.     dummy1 = 1.306562964 * out[49];
  513.     dummy2 = 0.923879532 * (out[49] + out[57]);
  514.     dummy3 = -0.5411961 * out[57];
  515.     out1[49] = dummy1 - dummy2;
  516.     out1[57] = dummy2 + dummy3;  
  517.     dummy1 = 1.306562964 * out[50];
  518.     dummy2 = 0.923879532 * (out[50] + out[58]);
  519.     dummy3 = -0.5411961 * out[58];
  520.     out1[50] = dummy1 - dummy2;
  521.     out1[58] = dummy2 + dummy3;  
  522.     dummy1 = 1.306562964 * out[52];
  523.     dummy2 = 0.923879532 * (out[52] + out[60]);
  524.     dummy3 = -0.5411961 * out[60];
  525.     out1[52] = dummy1 - dummy2;
  526.     out1[60] = dummy2 + dummy3;  
  527.     dummy1 = 0.923879532 * out[51];
  528.     dummy2 = 0.653281481 * (out[51] + out[59]);
  529.     dummy3 = -0.382683432 * out[59];
  530.     out1[51] = dummy1 - dummy2;
  531.     out1[59] = dummy2 + dummy3;  
  532.     dummy1 = 0.923879532 * out[53];
  533.     dummy2 = 0.653281481 * (out[53] + out[61]);
  534.     dummy3 = -0.382683432 * out[61];
  535.     out1[53] = dummy1 - dummy2;
  536.     out1[61] = dummy2 + dummy3;
  537.     temp1 = 0.5 * (out[54] + out[63]);
  538.     temp2 = 0.5 * (out[55] - out[62]);
  539.     temp3 = out[54] - out[63];
  540.     temp4 = out[55] + out[62];
  541.     temp5 = 0.35355339 * (temp3 - temp4);
  542.     temp6 = 0.35355339 * (temp3 + temp4);
  543.     out1[54] = temp1 - temp6;
  544.     out1[55] = temp2 + temp5;
  545.     out1[62] = temp5 - temp2;
  546.     out1[63] = temp1 + temp6; /* 22 multiplications 28 additions */
  547.     /*for (i=0; i<64; i++) printf("out1[%d] = %f\n",i,out1[i]);*/
  548.  
  549.     /********* Post Additions *********/
  550.     temp1 = out1[0] + out1[8];
  551.     temp2 = out1[1] + out1[9];
  552.     temp3 = out1[2] + out1[10];
  553.     temp4 = out1[3] + out1[11];
  554.     temp5 = out1[4] + out1[12];
  555.     temp6 = out1[5] + out1[13];
  556.     temp7 = out1[6] + out1[14];
  557.     temp8 = out1[7] + out1[15];
  558.     out[0] = temp1 + temp2;
  559.     out[1] = temp1 - temp2;
  560.     out[2] = temp4;
  561.     out[3] = temp3 - temp4;
  562.     out[4] = temp7 - temp6;
  563.     out[5] = temp8;
  564.     out[6] = -temp5 - temp7;
  565.     out[7] = temp6 + temp8;
  566.     temp1 = out1[0] - out1[8];
  567.     temp2 = out1[1] - out1[9];
  568.     temp3 = out1[2] - out1[10];
  569.     temp4 = out1[3] - out1[11];
  570.     temp5 = out1[4] - out1[12];
  571.     temp6 = out1[5] - out1[13];
  572.     temp7 = out1[6] - out1[14];
  573.     temp8 = out1[7] - out1[15];
  574.     out[8] = temp1 + temp2;
  575.     out[9] = temp1 - temp2;
  576.     out[10] = temp4;
  577.     out[11] = temp3 - temp4;
  578.     out[12] = temp7 - temp6;
  579.     out[13] = temp8;
  580.     out[14] = -temp5 - temp7;
  581.     out[15] = temp6 + temp8;
  582.     out[16] = out1[24] + out1[25];
  583.     out[17] = out1[24] - out1[25];
  584.     out[18] = out1[27];
  585.     out[19] = out1[26] - out1[27];
  586.     out[20] = out1[30] - out1[29];
  587.     out[21] = out1[31];
  588.     out[22] = -out1[28] - out1[30];
  589.     out[23] = out1[29] + out1[31];
  590.     temp1 = out1[16] - out1[24];
  591.     temp2 = out1[17] - out1[25];
  592.     temp3 = out1[18] - out1[26];
  593.     temp4 = out1[19] - out1[27];
  594.     temp5 = out1[20] - out1[28];
  595.     temp6 = out1[21] - out1[29];
  596.     temp7 = out1[22] - out1[30];
  597.     temp8 = out1[23] - out1[31];
  598.     out[24] = temp1 + temp2;
  599.     out[25] = temp1 - temp2;
  600.     out[26] = temp4;
  601.     out[27] = temp3 - temp4;
  602.     out[28] = temp7 - temp6;
  603.     out[29] = temp8;
  604.     out[30] = -temp5 - temp7;
  605.     out[31] = temp6 + temp8;
  606.     temp1 = out1[48] - out1[40];
  607.     temp2 = out1[49] - out1[41];
  608.     temp3 = out1[50] - out1[42];
  609.     temp4 = out1[51] - out1[43];
  610.     temp5 = out1[52] - out1[44];
  611.     temp6 = out1[53] - out1[45];
  612.     temp7 = out1[54] - out1[46];
  613.     temp8 = out1[55] - out1[47];
  614.     out[32] = temp1 + temp2;
  615.     out[33] = temp1 - temp2;
  616.     out[34] = temp4;
  617.     out[35] = temp3 - temp4;
  618.     out[36] = temp7 - temp6;
  619.     out[37] = temp8;
  620.     out[38] = -temp5 - temp7;
  621.     out[39] = temp6 + temp8;
  622.     out[40] = out1[56] + out1[57];
  623.     out[41] = out1[56] - out1[57];
  624.     out[42] = out1[59];
  625.     out[43] = out1[58] - out1[59];
  626.     out[44] = out1[62] - out1[61];
  627.     out[45] = out1[63];
  628.     out[46] = -out1[60] - out1[62];
  629.     out[47] = out1[63] + out1[61];
  630.     temp1 = -out1[32] - out1[48];
  631.     temp2 = -out1[33] - out1[49];
  632.     temp3 = -out1[34] - out1[50];
  633.     temp4 = -out1[35] - out1[51];
  634.     temp5 = -out1[36] - out1[52];
  635.     temp6 = -out1[37] - out1[53];
  636.     temp7 = -out1[38] - out1[54];
  637.     temp8 = -out1[39] - out1[55];
  638.     out[48] = temp1 + temp2;
  639.     out[49] = temp1 - temp2;
  640.     out[50] = temp4;
  641.     out[51] = temp3 - temp4;
  642.     out[52] = temp7 - temp6;
  643.     out[53] = temp8;
  644.     out[54] = -temp5 - temp7;
  645.     out[55] = temp6 + temp8;
  646.     temp1 = out1[40] + out1[56];
  647.     temp2 = out1[41] + out1[57];
  648.     temp3 = out1[42] + out1[58];
  649.     temp4 = out1[43] + out1[59];
  650.     temp5 = out1[44] + out1[60];
  651.     temp6 = out1[45] + out1[61];
  652.     temp7 = out1[46] + out1[62];
  653.     temp8 = out1[47] + out1[63];
  654.     out[56] = temp1 + temp2;
  655.     out[57] = temp1 - temp2;
  656.     out[58] = temp4;
  657.     out[59] = temp3 - temp4;
  658.     out[60] = temp7 - temp6;
  659.     out[61] = temp8;
  660.     out[62] = -temp5 - temp7;
  661.     out[63] = temp6 + temp8; /* 96 additions */
  662.     /*for (i=0; i<64; i++) printf("out[%d] = %f\n",i,out[i]);*/
  663.  
  664.     temp1 = out[0] + out[16];
  665.     temp2 = out[1] + out[17];
  666.     temp3 = out[2] + out[18];
  667.     temp4 = out[3] + out[19];
  668.     temp5 = out[4] + out[20];
  669.     temp6 = out[5] + out[21];
  670.     temp7 = out[6] + out[22];
  671.     temp8 = out[7] + out[23];
  672.     out1[0] = temp1 + temp3;
  673.     out1[1] = temp2 + temp4;
  674.     out1[2] = temp2 - temp4;
  675.     out1[3] = temp1 - temp3;
  676.     out1[4] = temp5;
  677.     out1[5] = temp6;
  678.     out1[6] = temp7;
  679.     out1[7] = temp8;
  680.     temp1 = out[8] + out[24];
  681.     temp2 = out[9] + out[25];
  682.     temp3 = out[10] + out[26];
  683.     temp4 = out[11] + out[27];
  684.     temp5 = out[12] + out[28];
  685.     temp6 = out[13] + out[29];
  686.     temp7 = out[14] + out[30];
  687.     temp8 = out[15] + out[31];
  688.     out1[8] = temp1 + temp3;
  689.     out1[9] = temp2 + temp4;
  690.     out1[10] = temp2 - temp4;
  691.     out1[11] = temp1 - temp3;
  692.     out1[12] = temp5;
  693.     out1[13] = temp6;
  694.     out1[14] = temp7;
  695.     out1[15] = temp8;
  696.     temp1 = out[8] - out[24];
  697.     temp2 = out[9] - out[25];
  698.     temp3 = out[10] - out[26];
  699.     temp4 = out[11] - out[27];
  700.     temp5 = out[12] - out[28];
  701.     temp6 = out[13] - out[29];
  702.     temp7 = out[14] - out[30];
  703.     temp8 = out[15] - out[31];
  704.     out1[16] = temp1 + temp3;
  705.     out1[17] = temp2 + temp4;
  706.     out1[18] = temp2 - temp4;
  707.     out1[19] = temp1 - temp3;
  708.     out1[20] = temp5;
  709.     out1[21] = temp6;
  710.     out1[22] = temp7;
  711.     out1[23] = temp8;
  712.     temp1 = out[0] - out[16];
  713.     temp2 = out[1] - out[17];
  714.     temp3 = out[2] - out[18];
  715.     temp4 = out[3] - out[19];
  716.     temp5 = out[4] - out[20];
  717.     temp6 = out[5] - out[21];
  718.     temp7 = out[6] - out[22];
  719.     temp8 = out[7] - out[23];
  720.     out1[24] = temp1 + temp3;
  721.     out1[25] = temp2 + temp4;
  722.     out1[26] = temp2 - temp4;
  723.     out1[27] = temp1 - temp3;
  724.     out1[28] = temp5;
  725.     out1[29] = temp6;
  726.     out1[30] = temp7;
  727.     out1[31] = temp8;
  728.     out1[32] = out[32] + out[34];
  729.     out1[33] = out[33] + out[35];
  730.     out1[34] = out[33] - out[35];
  731.     out1[35] = out[32] - out[34];
  732.     out1[36] = out[36];
  733.     out1[37] = out[37];
  734.     out1[38] = out[38];
  735.     out1[39] = out[39];
  736.     out1[40] = out[40] + out[42];
  737.     out1[41] = out[41] + out[43];
  738.     out1[42] = out[41] - out[43];
  739.     out1[43] = out[40] - out[42];
  740.     out1[44] = out[44];
  741.     out1[45] = out[45];
  742.     out1[46] = out[46];
  743.     out1[47] = out[47];
  744.     out1[48] = out[48] + out[50];
  745.     out1[49] = out[49] + out[51];
  746.     out1[50] = out[49] - out[51];
  747.     out1[51] = out[48] - out[50];
  748.     out1[52] = out[52];
  749.     out1[53] = out[53];
  750.     out1[54] = out[54];
  751.     out1[55] = out[55];
  752.     out1[56] = out[56] + out[58];
  753.     out1[57] = out[57] + out[59];
  754.     out1[58] = out[57] - out[59];
  755.     out1[59] = out[56] - out[58];
  756.     out1[60] = out[60];
  757.     out1[61] = out[61];
  758.     out1[62] = out[62];
  759.     out1[63] = out[63]; /* 64 additions */
  760.     /*for (i=0; i<64; i++) printf("out1[%d] = %f\n",i,out1[i]);*/
  761.  
  762.     temp1 = out1[0] + out1[32];
  763.     temp2 = out1[1] + out1[33];
  764.     temp3 = out1[2] + out1[34];
  765.     temp4 = out1[3] + out1[35];
  766.     temp5 = out1[4] + out1[36];
  767.     temp6 = out1[5] + out1[37];
  768.     temp7 = out1[6] + out1[38];
  769.     temp8 = out1[7] + out1[39];
  770.     U[0] = temp1 + temp5;
  771.     U[8] = temp2 + temp6;
  772.     U[16] = temp3 + temp7;
  773.     U[24] = temp4 + temp8;
  774.     U[32] = temp4 - temp8;
  775.     U[40] = temp3 - temp7;
  776.     U[48] = temp2 - temp6;
  777.     U[56] = temp1 - temp5;
  778.     temp1 = out1[8] + out1[40];
  779.     temp2 = out1[9] + out1[41];
  780.     temp3 = out1[10] + out1[42];
  781.     temp4 = out1[11] + out1[43];
  782.     temp5 = out1[12] + out1[44];
  783.     temp6 = out1[13] + out1[45];
  784.     temp7 = out1[14] + out1[46];
  785.     temp8 = out1[15] + out1[47];
  786.     U[1] = temp1 + temp5;
  787.     U[9] = temp2 + temp6;
  788.     U[17] = temp3 + temp7;
  789.     U[25] = temp4 + temp8;
  790.     U[33] = temp4 - temp8;
  791.     U[41] = temp3 - temp7;
  792.     U[49] = temp2 - temp6;
  793.     U[57] = temp1 - temp5;
  794.     temp1 = out1[16] + out1[48];
  795.     temp2 = out1[17] + out1[49];
  796.     temp3 = out1[18] + out1[50];
  797.     temp4 = out1[19] + out1[51];
  798.     temp5 = out1[20] + out1[52];
  799.     temp6 = out1[21] + out1[53];
  800.     temp7 = out1[22] + out1[54];
  801.     temp8 = out1[23] + out1[55];
  802.     U[2] = temp1 + temp5;
  803.     U[10] = temp2 + temp6;
  804.     U[18] = temp3 + temp7;
  805.     U[26] = temp4 + temp8;
  806.     U[34] = temp4 - temp8;
  807.     U[42] = temp3 - temp7;
  808.     U[50] = temp2 - temp6;
  809.     U[58] = temp1 - temp5;
  810.     temp1 = out1[24] + out1[56];
  811.     temp2 = out1[25] + out1[57];
  812.     temp3 = out1[26] + out1[58];
  813.     temp4 = out1[27] + out1[59];
  814.     temp5 = out1[28] + out1[60];
  815.     temp6 = out1[29] + out1[61];
  816.     temp7 = out1[30] + out1[62];
  817.     temp8 = out1[31] + out1[63];
  818.     U[3] = temp1 + temp5;
  819.     U[11] = temp2 + temp6;
  820.     U[19] = temp3 + temp7;
  821.     U[27] = temp4 + temp8;
  822.     U[35] = temp4 - temp8;
  823.     U[43] = temp3 - temp7;
  824.     U[51] = temp2 - temp6;
  825.     U[59] = temp1 - temp5;
  826.     temp1 = out1[24] - out1[56];
  827.     temp2 = out1[25] - out1[57];
  828.     temp3 = out1[26] - out1[58];
  829.     temp4 = out1[27] - out1[59];
  830.     temp5 = out1[28] - out1[60];
  831.     temp6 = out1[29] - out1[61];
  832.     temp7 = out1[30] - out1[62];
  833.     temp8 = out1[31] - out1[63];
  834.     U[4] = temp1 + temp5;
  835.     U[12] = temp2 + temp6;
  836.     U[20] = temp3 + temp7;
  837.     U[28] = temp4 + temp8;
  838.     U[36] = temp4 - temp8;
  839.     U[44] = temp3 - temp7;
  840.     U[52] = temp2 - temp6;
  841.     U[60] = temp1 - temp5;
  842.     temp1 = out1[16] - out1[48];
  843.     temp2 = out1[17] - out1[49];
  844.     temp3 = out1[18] - out1[50];
  845.     temp4 = out1[19] - out1[51];
  846.     temp5 = out1[20] - out1[52];
  847.     temp6 = out1[21] - out1[53];
  848.     temp7 = out1[22] - out1[54];
  849.     temp8 = out1[23] - out1[55];
  850.     U[5] = temp1 + temp5;
  851.     U[13] = temp2 + temp6;
  852.     U[21] = temp3 + temp7;
  853.     U[29] = temp4 + temp8;
  854.     U[37] = temp4 - temp8;
  855.     U[45] = temp3 - temp7;
  856.     U[53] = temp2 - temp6;
  857.     U[61] = temp1 - temp5;
  858.     temp1 = out1[8] - out1[40];
  859.     temp2 = out1[9] - out1[41];
  860.     temp3 = out1[10] - out1[42];
  861.     temp4 = out1[11] - out1[43];
  862.     temp5 = out1[12] - out1[44];
  863.     temp6 = out1[13] - out1[45];
  864.     temp7 = out1[14] - out1[46];
  865.     temp8 = out1[15] - out1[47];
  866.     U[6] = temp1 + temp5;
  867.     U[14] = temp2 + temp6;
  868.     U[22] = temp3 + temp7;
  869.     U[30] = temp4 + temp8;
  870.     U[38] = temp4 - temp8;
  871.     U[46] = temp3 - temp7;
  872.     U[54] = temp2 - temp6;
  873.     U[62] = temp1 - temp5;
  874.     temp1 = out1[0] - out1[32];
  875.     temp2 = out1[1] - out1[33];
  876.     temp3 = out1[2] - out1[34];
  877.     temp4 = out1[3] - out1[35];
  878.     temp5 = out1[4] - out1[36];
  879.     temp6 = out1[5] - out1[37];
  880.     temp7 = out1[6] - out1[38];
  881.     temp8 = out1[7] - out1[39];
  882.     U[7] = temp1 + temp5;
  883.     U[15] = temp2 + temp6;
  884.     U[23] = temp3 + temp7;
  885.     U[31] = temp4 + temp8;
  886.     U[39] = temp4 - temp8;
  887.     U[47] = temp3 - temp7;
  888.     U[55] = temp2 - temp6;
  889.     U[63] = temp1 - temp5; /* 128 additions */
  890. }
  891.